﻿
using Castle.Core.Internal;
using Coldairarrow.Business.Interface;
using Coldairarrow.Entity.Base_Manage;
using Coldairarrow.Entity.Interface;
using Coldairarrow.Util;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics.Tracing;
using System.Globalization;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Security.Cryptography;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;

namespace Coldairarrow.Business.Interface
{
    public class SalesInvoiceInterfaceBusiness : Interface_BaseBusiness, IJob_Business, ITransientDependency
    {
        public Base_InterfaceOption queryOption { get; set; }
        public Base_InterfaceOption insertOption { get; set; }
        public Base_InterfaceOption upDateOption { get; set; }
        public Base_InterfaceOption deleteOption { get; set; }
        public List<OL_FilterDTO> Filters { get; set; }
        public SalesInvoiceInterfaceBusiness()
        {
            this.InterfaceName = "1C收款单";
            //获取字段的映射关系
            tableField = GetMapField("editRow");
            //索引字段
            Keys = GetKeys("editRow");
            indexFields.Add(Keys.Where(X => X.Type == "K").First().Field);
            //查询过滤条件
            Filters = new List<OL_FilterDTO>();

            //数据库连接
            ConString = JsonSettingHelper.GetSetting("Database:BaseDb:ConnectionString");
            SqlDb = (SqlServerHelper)DbHelperFactory.GetDbHelper(EFCore.Sharding.DatabaseType.SqlServer, ConString);
            //获取此接口的所有API信息
            this.interfaceOption = SqlDb.GetListBySql<Base_InterfaceOption>(@$"SELECT * FROM  Base_InterfaceOption(NOLOCK) WHERE Name='{InterfaceName}' ");
            this.queryOption = this.interfaceOption.Where(o => o.OperateType == "getFilterRows").First();//查询API配置
            this.insertOption = this.interfaceOption.Where(o => o.OperateType == "addRow").First();//新增API配置
            this.upDateOption = this.interfaceOption.Where(o => o.OperateType == "editRow").First();//更行API配置

            //查询执行前的事件
            BeforeQueryEvent += InterfaceBusiness_BeforeQueryEvent;
            //查询执行中的事件
            OnQueryEvent += InterfaceBusiness_OnQueryEvent;
            //执行非查询请求中的事件
            OnNoQueryEvent += InterfaceBusiness_OnNoQueryEvent;

        }

        /// <summary>
        /// 执行非查询请求中时间
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="noQueryEventArgs"></param>
        private void InterfaceBusiness_OnNoQueryEvent(object sender, NoQueryEventArgs noQueryEventArgs)
        {
            //API请求是否成功
            noQueryEventArgs.Success = noQueryEventArgs.Result["success"].ToString().ToBool();
        }

        /// <summary>
        /// 查询执行前的事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="queryEventArgs"></param>
        private void InterfaceBusiness_BeforeQueryEvent(object sender, QueryEventArgs queryEventArgs)
        {
            //执行查询前添加过滤条件
            if (queryEventArgs.Page.Filters.IsNullOrEmpty() && !Filters.IsNullOrEmpty())
            {
                queryEventArgs.Page.Filters = Filters;
            }

        }

        /// <summary>
        /// 查询执行中的事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="queryEventArgs"></param>
        private void InterfaceBusiness_OnQueryEvent(object sender, QueryEventArgs queryEventArgs)
        {
            //是否查询完成
            if (queryEventArgs.Result["data"]["rows"].ToList().Count == 0)
            {
                queryEventArgs.Page.Complete = true;
            }
            //向总行中添加新的行
            queryEventArgs.Rows.AddRange(queryEventArgs.Result["data"]["rows"].ToList());
            //获取总页数
            queryEventArgs.Page.Total = queryEventArgs.Result["data"]["total"].ToString().ToInt();
            //获取查询成功标志
            queryEventArgs.Success = queryEventArgs.Result["success"].ToString().ToBool();
        }


        /// <summary>
        /// 执行增删改查业务
        /// </summary>
        public async void ExecuteInterface()
        {

            try
            {
                //数据库连接
                //ConString = JsonSettingHelper.GetSetting("Database:BaseDb:ConnectionString");
                //SqlDb = (SqlServerHelper)DbHelperFactory.GetDbHelper(EFCore.Sharding.DatabaseType.SqlServer, ConString);

                ////获取此接口的所有API信息
                //this.interfaceOption = SqlDb.GetListBySql<Base_InterfaceOption>(@$"SELECT * FROM  Base_InterfaceOption(NOLOCK) WHERE Name='{InterfaceName}' ");
                //Base_InterfaceOption queryOption = this.interfaceOption.Where(o => o.OperateType == "getFilterRows").First();//查询API配置
                //Base_InterfaceOption insertOption = this.interfaceOption.Where(o => o.OperateType == "addRow").First();//新增API配置
                //Base_InterfaceOption upDateOption = this.interfaceOption.Where(o => o.OperateType == "editRow").First();//更行API配置
                //Base_InterfaceOption deleteOption = this.interfaceOption.Where(o => o.OperateType == "deleteRow").First();//删除API配置


                //获取源数据
                OC_SalesInvoiceInterfaceBusiness OZ_SalesInvoice = new OC_SalesInvoiceInterfaceBusiness();
                List<SalesInvoice_Rows> rows = await OZ_SalesInvoice.QueryAsync<SalesInvoice_Rows>(OZ_SalesInvoice.OC_Query, OZ_SalesInvoice.SqlDb);
                List<SalesInvoice> sourceData = new List<SalesInvoice>();
                foreach (var row in rows)
                {
                    foreach (var item1 in row.items)
                    {
                        item1.rowId = row.id + item1.rowId;
                        item1.date = row.date;
                        item1.number = row.number;
                        item1.counterparty = row.counterparty;
                        item1.amount = row.amount;
                        item1.currency = row.currency;
                        item1.invoice = row.invoice;
                        item1.invoiceNo = row.invoiceNo;
                        item1.warehouse = row.warehouse;
                        item1.type = row.type;
                        item1.division = row.division;
                        item1.signed = row.signed;
                        item1.responsible = row.responsible;
                        item1.comment = row.comment;
                        item1.EDOstatus = row.EDOstatus;
                        item1.bankAccount = row.bankAccount;
                        item1.contract = row.contract;
                        item1.payment = row.payment;
                        item1.paymentNO = row.payment.RegexMatch(@"\b\d{2}[А-Яа-я0-9]{2}-\d{6}\b");
                        string date = row.payment.RegexMatch(@"(\d{1,2}\.\d{1,2}\.\d{1,4})");
                        item1.paymentDate = date.IsNullOrEmpty() ? "" : DateTime.ParseExact(date, "dd.MM.yyyy", CultureInfo.InvariantCulture).ToString("yyyy-MM-dd");

                        sourceData.Add(item1);
                    }
                }
                var r = sourceData.GroupBy(x => x.rowId).Where(x => x.Count() > 1);
                //获取目标数据
                List<SalesInvoice> targetData = new List<SalesInvoice>();//目标据集合
                var fDate = sourceData.OrderBy(x => x.date.ToDateTime()).First().date.ToDateTime().ToString("yyyy-MM-dd");
                Filters.Clear();
                Filters.Add(
                //13:>,14>=15:<,16<=
                new OL_FilterDTO() { ControlId = "67d14fd5cd44971bbf2f88cd", DataType = 15, SpliceType = 1, FilterType = 14, Value = fDate }//FDATE字段过滤日开
            );
                targetData = await QueryAsync<SalesInvoice>(queryOption, tableField, SqlDb);



                #region ID存在重复的增删改处理方式
                //List<SalesInvoice> insertRows = new List<SalesInvoice>();
                //List<SalesInvoice> updataRows = new List<SalesInvoice>();
                //List<SalesInvoice> deleteRows = new List<SalesInvoice>();
                //foreach (var item1 in targetData)
                //{
                //    var row = sourceData.Where(x => x.id.TrimEnd().TrimStart().Equals(item1.id)).ToList();
                //    //如果两边都存在数据,则添加到updataRows，做比较更新
                //    if (!row.IsNullOrEmpty() && row.Count > 0)
                //    {
                //        var temp = row.First();
                //        temp.RowId = item1.RowId;
                //        updataRows.Add(temp);
                //        sourceData.Remove(temp);
                //    }
                //    //如果不存在则需要删除该行
                //    else
                //    {
                //        deleteRows.Add(item1);
                //    }
                //}
                //insertRows.AddRange(sourceData);
                if (this.State > 0 && sourceData.Count > 0)
                {
                    //更新
                    #region
                    List<SalesInvoice> updataItem = sourceData.Intersect(targetData, new ComparerFromKeys<SalesInvoice>(Keys, "RowId")).ToList();//获取交集(更新项)
                    List<OL_RowDTO> updataData = ConvertOL_Row(updataItem, tableField);//需要更新的数据集合
                    ExecuteNoQuery<OL_RowDTO>(updataData, upDateOption, SqlDb);//执行更新
                    #endregion

                    //新增
                    #region
                    List<SalesInvoice> insertItem = sourceData.Except(targetData, new ComparerFromKey<SalesInvoice>(indexFields.First(), "RowId")).ToList();//获取源数据对目标数据的差集(新增项)
                    List<OL_RowDTO> insertData = ConvertOL_Row(insertItem, tableField);//需要新增的数据集合
                    ExecuteNoQuery<OL_RowDTO>(insertData, insertOption, SqlDb);//执行插入行
                    #endregion

                    //删除
                    #region
                    List<SalesInvoice> deleteItem = targetData.Except(sourceData, new ComparerFromKey<SalesInvoice>(indexFields.First(), "RowId")).ToList();//获取目标数对据源数据的差集(删除项)
                    List<OL_RowDTO> deleteData = ConvertOL_Row(deleteItem, tableField);//需要删除的数据集合
                    ExecuteNoQuery<OL_RowDTO>(deleteData, deleteOption, SqlDb);//执行删除行
                    #endregion
                }
                #endregion
            }


            catch (Exception ex)
            {
                AddLog(SqlDb, ex.Message, InterfaceName, "erro", "");
            }
        }

        /// <summary>
        /// 将源数据根据字典映射关系转换成OL_RowDTO
        /// </summary>
        /// <typeparam name="T">源数据</typeparam>
        /// <param name="sourceData">源数据</param>
        /// <param name="map">Key为目标字段名称，Value为源字段名称</param>
        /// <returns></returns>
        public List<OL_RowDTO> ConvertOL_Row<T>(List<T> sourceData, Dictionary<string, string> map)
        {
            List<OL_RowDTO> list = new List<OL_RowDTO>();
            object rowId;
            foreach (var item in sourceData)
            {
                rowId = item.GetPropertyValue("RowId");
                //需要新增的数据
                OL_RowDTO row = new OL_RowDTO() { RowId = rowId.IsNullOrEmpty() ? null : rowId.ToString(), Controls = new List<Control>() };
                foreach (var c in map)
                {
                    //获取字段的键值做判断
                    var field = Keys.Where(x => x.TField == c.Key).ToList();
                    string isKey = "";
                    if (field.Count > 0) isKey = field.First().Type;
                    //判断对象的字段是否存在
                    if (item.ContainsProperty(c.Value) && isKey != "N")
                    {
                        //存在则添加数据
                        row.Controls.Add(new Control() { ControlId = c.Key, Value = item.GetPropertyValue(c.Value) });
                    }
                }
                list.Add(row);
            }
            return list;
        }

        /// <summary>
        /// 任务
        /// </summary>
        public void Job()
        {
            ExecuteInterface();
        }
    }

}
